package jcworks;
import java.io.*;
import java.util.*;


public class Szkeleton_Vezerlo extends Vezerlo {

    public Szkeleton_Vezerlo() {

        if(Vezerlo.konzolnaplozas)
                    {
                        Vezerlo.naplozas("A SzkeletonVezerlo osztaly letrejott");
                    }
    }



	public int elemLetrehozas(StringTokenizer st, int kompozitazonosito) throws Exception {

            

            String elemtipus = st.nextToken();  //elmentük hogy a parancsban melyik elemet kell letrehozni

            int kompozitmunkaazonosito = -1;    // ennek az erteke ha nagyobb -1-nél akkor kompozitelemben dolgozunk, különben ha -1 akkro a fő munkaterületen
                KompozitElem fokompozitelem = new KompozitElem(0,0);    //megprobálom kivenni, de azért kell, hogyha a kompozitelembe dolgozunk, akkro tudjuk hogy melyikbe
                if (kompozitazonosito > -1){
                fokompozitelem = (KompozitElem) munkaterulet.getAlkatreszLista().get(kompozitazonosito);
            }

             //Jelgenerátor létrehozása
                if(elemtipus.equals("jelgenerator"))
                {
                     Jelgenerator jelgenerator = new Jelgenerator();                 //jelgenerator peldanyositasa
                     jelgenerator.setAzonosito(Integer.parseInt(st.nextToken()));    //azonosito beallitasa
                     jelgenerator.setJelsorozat(st.nextToken());

                     if ( kompozitazonosito>-1 ) fokompozitelem.hozzaadEpitoelem(jelgenerator); //ha kompozitelembe hozunk létre elemet
                          else munkaterulet.hozzaadEpitoelem(jelgenerator);
                                                                          //hozzaadas a munkaterulethez
                 }

             //Kapcsoló létrehozása
              if(elemtipus.equals("kapcsolo"))
                {
                     int azonosito = Integer.parseInt(st.nextToken());          //azonositot eltarolom
                     int kapcsoloallas =  Integer.parseInt(st.nextToken());     //kapcsolo allasat eltarolom
                     Kapcsolo kapcsolo = new Kapcsolo(kapcsoloallas);              //jelgenerator peldanyositasa
                     kapcsolo.setAzonosito(azonosito);                               //azonosito beallitasa

                     if ( kompozitazonosito>-1 ) fokompozitelem.hozzaadEpitoelem(kapcsolo); //ha kompozitelembe hozunk létre elemet
                          else munkaterulet.hozzaadEpitoelem(kapcsolo);                   //hozzaadas a munkaterulethez
                    
                }

            //És kapu létrehozása
                if(elemtipus.equals("esKapu"))
                {
                     ES_Kapu es_kapu= new ES_Kapu();                                 // es kapu peldanyositasa
                     es_kapu.setAzonosito(Integer.parseInt(st.nextToken()));         //azonosito beallitasa
                
                     if ( kompozitazonosito>-1 ) fokompozitelem.hozzaadEpitoelem(es_kapu); //ha kompozitelembe hozunk létre elemet
                          else munkaterulet.hozzaadEpitoelem(es_kapu);                     //hozzadas a munakterulethez
                     
                }

            //Vagy kapu létrehozása
                if(elemtipus.equals("vagyKapu"))
                {
                     VAG_Kapu vagy_kapu = new VAG_Kapu();                             //vagy kapu peldanyositasa
                     vagy_kapu.setAzonosito(Integer.parseInt(st.nextToken()));        //azonosito beallitasa

                    if ( kompozitazonosito>-1 ) fokompozitelem.hozzaadEpitoelem(vagy_kapu); //ha kompozitelembe hozunk létre elemet
                          else munkaterulet.hozzaadEpitoelem(vagy_kapu);                   //hozzaadas a munkaterulethez
                     
                }


            //Inverter létrehozása
                if(elemtipus.equals("inverter"))
                {
                    Inverter inverter = new Inverter();                              //vagy kapu peldanyositasa
                    inverter.setAzonosito(Integer.parseInt(st.nextToken()));         //azonosito beallitasa

                    if ( kompozitazonosito>-1 ) fokompozitelem.hozzaadEpitoelem(inverter); //ha kompozitelembe hozunk létre elemet
                          else munkaterulet.hozzaadEpitoelem(inverter);                   //hozzaadas a munkaterulethez
                    
                }

            //Kijelző létrehozása
                if(elemtipus.equals("kijelzo"))
                {
                    Kijelzo kijelzo = new Kijelzo();                                 //kijelzo peldanyositasa
                    kijelzo.setAzonosito(Integer.parseInt(st.nextToken()));          //azonosito beallitasa

                    if ( kompozitazonosito>-1 ) fokompozitelem.hozzaadEpitoelem(kijelzo); //ha kompozitelembe hozunk létre elemet
                          else munkaterulet.hozzaadEpitoelem(kijelzo);                       //hozzaadas a munkaterulethez
                    
                }

            //Kompozitelem létrehozása
                if(elemtipus.equals("kompozitElem"))
                {
                    int azonosito = Integer.parseInt(st.nextToken());   // eltaroljuk az azonositot
                    KompozitElem kompozitelem = new KompozitElem(Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken()));              //kompozitelem peldanyositasa a bemeneti és a kimeneti lábak számával paraméterezve
                    kompozitelem.setAzonosito(azonosito);     //azonosito beallitasa
                    kompozitmunkaazonosito = azonosito; // a kompozitmunkát átállítjuk a kompozitelem azonositojara, igy legkozelebb nem -1 lesz, hanem ebbe a kompozitelembe dolgozunk
                     if ( kompozitazonosito>-1 ) fokompozitelem.hozzaadEpitoelem(kompozitelem); //ha kompozitelembe hozunk létre elemet
                          else munkaterulet.hozzaadEpitoelem(kompozitelem);                       //hozzaadas a munkaterulethez
                     
                }

            //Oszcilloszkóp létrehozása
                if(elemtipus.equals("oszcilloszkop"))
                {
                    Kijelzo oszcilloszkop = new Oszcilloszkop();                                 //kijelzo peldanyositasa
                    oszcilloszkop.setAzonosito(Integer.parseInt(st.nextToken()));          //azonosito beallitasa

                    if ( kompozitazonosito>-1 ) fokompozitelem.hozzaadEpitoelem(oszcilloszkop); //ha kompozitelembe hozunk létre elemet
                          else munkaterulet.hozzaadEpitoelem(oszcilloszkop);                      //hozzaadas a munkaterulethez
                   
                }

                return kompozitmunkaazonosito;  // visszaadjuk a kompozit elem azponositojat, vagy -1-et
         }

         public void drotozas(StringTokenizer st,int kompozitazonosito) throws Exception
         {
             Drot drot = new Drot();                                            // drot peldanyostiasa
             ArrayList<Epitoelemek> lista = munkaterulet.getAlkatreszLista();   // letrehozunk egy listat, ami megfelel az alkatreszlistanak


             KompozitElem fokompozitelem = new KompozitElem(0,0);
                if (kompozitazonosito > -1){        //ha a kompozitelemben vagyunk, akkro oda kell letrehozni a drotokat is
                fokompozitelem = (KompozitElem) munkaterulet.getAlkatreszLista().get(kompozitazonosito);
            }


             String forras = st.nextToken();    //forrascim tarolasa
             st.nextToken();                    // to szó kiszűrése
             String cel = st.nextToken();       //celcím tárolása

             
             int forrasindex = 0;           //ezekbe taroljuk majd el a forras és a cél helyét a listában, indexét
             int celindex = 0;

             if(forras.contains("."))       // megvizsgáljuk, hogy ha a forras stringben van . akkor labat kell összekötni elemmel
             {
                 StringTokenizer stf = new StringTokenizer(forras,".");  // raallitom a stringtokenizert a forrasra, igy tudom az azonositot es a labat
                 int azonosito = Integer.parseInt(stf.nextToken());     //kiszűröm a forrásból a kompozitelem azonosítóját
                 int labazonosito = Integer.parseInt(stf.nextToken());  //kiszűröm a forrásból a kompozilab azonosítóját

                 for (int i=0;i<lista.size();i++)
                     if ((lista.get(i).azonosito == labazonosito) && lista.get(i) instanceof KompozitLab)   // ha megtalaltam azt a kompozitlabat aminek stimmel az azonosítója, akkor már drótozhatok is
                     {
                         if ( kompozitazonosito>-1 ) fokompozitelem.hozzaadDrot(munkaterulet.getAlkatreszLista().get(i), munkaterulet.getAlkatreszLista().get(celindex), drot); //ha kompozitelembe drótozunk
                          else munkaterulet.hozzaadDrot(munkaterulet.getAlkatreszLista().get(i), munkaterulet.getAlkatreszLista().get(celindex), drot);     // ha nem kompozitelembe drótozunk
                     }
                 
             } else
             if(cel.contains("."))  // ha a cel tartalmaz.-ot akkro egy elemet eg labbal kell összekötni
             {
                 StringTokenizer stf = new StringTokenizer(cel,".");  // raallitom a stringtokenizert a célra, igy tudom az azonositot es a labat
                 int azonosito = Integer.parseInt(stf.nextToken());     // kompozit elem azonositot eltarolom
                 int labazonosito = Integer.parseInt(stf.nextToken());  //labazonositot eltarolom

                 for (int i=0;i<lista.size();i++)
                     if ((lista.get(i).azonosito == labazonosito) && lista.get(i) instanceof KompozitLab)
                     {
                         if ( kompozitazonosito>-1 ) fokompozitelem.hozzaadDrot(lista.get(forrasindex), lista.get(i), drot); //ha kompozitelembe drotozunk
                          else munkaterulet.hozzaadDrot(lista.get(forrasindex), lista.get(i), drot);    //ha nem kompozitelembe drotozunk
                     }
             } else
             {
                //ilyenkor  •	wire_(id1)_to_(id2)
             
                for (int i=0;i<lista.size();i++) {
                    if (lista.get(i).azonosito == Integer.parseInt(forras)) forrasindex = i;    // beallitom a cel és a forrás helyét az alkatreszlistában
                    if (lista.get(i).azonosito == Integer.parseInt(cel)) celindex = i ;
                }
                if ( kompozitazonosito>-1 ) fokompozitelem.hozzaadDrot(lista.get(forrasindex), lista.get(celindex), drot); //ha kompozitelembe drótozunk
                          else munkaterulet.hozzaadDrot(munkaterulet.getAlkatreszLista().get(forrasindex), munkaterulet.getAlkatreszLista().get(celindex), drot);                //hozzadajuk a drotot a munkaterulethez
             }


         }

	

	public void parancsBekero() throws IOException, Exception {

            try {
                    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
                    String str = "";
                    int kompozitelemazonosito =-1;      // itt adjuk át a parancsértelmezőnek, hogy még nincs kompozitelemünk, majd ő a visszatérésével megmondja hogy hoztunk e létre
                    while (str != null)
                    {
                         str = in.readLine();
                        kompozitelemazonosito = parancsErtelmezo(str, kompozitelemazonosito);  // meghivjuk a parancsértelmezőt, aminek átadjuk a parancs stringet
                    }
            }
           catch (IOException e) {
                                 }
    }

            

	public int parancsErtelmezo(String parancs,int kompozitelemazonosito ) throws Exception
        {
            String parancskezdet;       // ebbe fogjuk tárolni a parancsot hogy new wire switc stb....
            StringTokenizer st = new StringTokenizer(parancs,"_");  // ráállítun kegy tokenizert a parancsstringre, így tudjuk majd darabolni

             // alapbol -1 ha nme vagyunk kompoztielembe, majd ha letrehoztuk akkor átadjuk neki azt az értéket amilyen azonosítójú az elem

            parancskezdet = st.nextToken();
            try{
                 if (parancskezdet.equals("new"))
                 {
                        kompozitelemazonosito =  elemLetrehozas(st,kompozitelemazonosito); // meghivjuk a létrehozást, a tokenizer paraméterrrel hogy darabolhato legyen tovább a parancs, és a kompozitelem azonosítóval, ha nincs akkor -1
                     
                 }

                 if(parancskezdet.equals("wire"))
                 {
                     drotozas(st,kompozitelemazonosito); // meghivjuk a drotozast is ugyanazon paraméterekkel
                 }

                 if(parancskezdet.equals("step")) this.step();              /*A vezerlo step() fuggvenyet hivja meg, a kov jelet adja a halozatba*/

                 if(parancskezdet.equals("quickrun"))
                 {
                     this.futtatas();
                 }
                          
                 if(parancskezdet.equals("switch"))
                 {
                     int azon = Integer.parseInt(st.nextToken());
                     ArrayList<Epitoelemek> lista = munkaterulet.getAlkatreszLista();
                     for (int i=0;i<lista.size();i++)
                     {
                         if (lista.get(i).azonosito == azon) azon = i;
                     }

                     Kapcsolo kapcsolo = new Kapcsolo();
                     kapcsolo = (Kapcsolo) munkaterulet.getAlkatreszLista().get(azon);
                     kapcsolo.setJel();
                 }

                 if (parancskezdet.equals("setGen"))
                 {
                    int azon = Integer.parseInt(st.nextToken());
                     ArrayList<Epitoelemek> lista = munkaterulet.getAlkatreszLista();
                     for (int i=0;i<lista.size();i++)
                     {
                         if (lista.get(i).azonosito == azon) azon = i;
                     }

                     Jelgenerator jelgen = new Jelgenerator();
                     jelgen = (Jelgenerator) munkaterulet.getAlkatreszLista().get(azon);
                     jelgen.setJelsorozat(st.nextToken());
                 }

                 if (parancskezdet.equals("endKomp"))
                     kompozitelemazonosito = -1;

                 if (parancskezdet.equals("display"))
                 {
                     int azon = Integer.parseInt(st.nextToken());
                     ArrayList<Epitoelemek> lista = munkaterulet.getAlkatreszLista();
                     for (int i=0;i<lista.size();i++)
                     {
                         if (lista.get(i).azonosito == azon) azon = i;
                     }
                     Oszcilloszkop oszcilloszkop = new Oszcilloszkop();
                     oszcilloszkop = (Oszcilloszkop) munkaterulet.getAlkatreszLista().get(azon);
                     oszcilloszkop.display();
                 }

                 if (parancskezdet.equals("copy"))
                 {
                     // a masolni kivant kompozit elem megkeresése
                     int azon = Integer.parseInt(st.nextToken());
                     ArrayList<Epitoelemek> lista = munkaterulet.getAlkatreszLista();
                     for (int i=0;i<lista.size();i++)
                     {
                         if (lista.get(i).azonosito == azon) azon = i;
                     }

                     KompozitElem kompozitelem = new KompozitElem(0,0);
                     kompozitelem = (KompozitElem) munkaterulet.getAlkatreszLista().get(azon);
                     // uj kompozit elem létrehozása, amibe másolunk
                     int ujazon = Integer.parseInt(st.nextToken());
                     KompozitElem kompozitelemmasolat = new KompozitElem(kompozitelem.beLabakSzama,kompozitelem.kiLabakSzama);
                     kompozitelemmasolat = kompozitelem;
                     kompozitelemmasolat.setAzonosito(ujazon);     //azonosito beallitasa

                     munkaterulet.hozzaadEpitoelem(kompozitelemmasolat);
                
                 }


      
            }
            catch(UresMunkateruletException e){
                Vezerlo.naplozas("Ures munkaterulet, eloszor letre kell hozni az aramkort!","Hiba");
            }

            Vezerlo.konzolnaplozas = true;  //azert hogy a catch ag utan is lefusson
            
            return kompozitelemazonosito;
	}

}
